home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 427_01 / testware / porttest.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-03-23  |  3.3 KB  |  130 lines

  1. program porttest;
  2.  
  3.  
  4. (* operates the parallel port on bit level for testing hardware *)
  5.  
  6.  
  7. uses crt;
  8.  
  9.  
  10. var
  11.   p_in,                 (* parallel port address (read)  *)
  12.   pout       : word;    (* parallel port address (write) *)
  13.   printer_no : byte;    (* parallel port number          *)
  14.   invert     : boolean; (* invert 'PE' display?          *)
  15.  
  16.  
  17. procedure init_ports;
  18. (* initializes print port address *)
  19. begin
  20.   pout := memw[$40:$8 + (printer_no - 1) * 2];
  21.   p_in := pout+1;
  22. end;
  23.  
  24.  
  25. function in_port:byte;
  26. (* reads byte from parallel port *)
  27. begin
  28.   in_port := port[p_in];
  29. end;
  30.  
  31.  
  32. procedure out_port(b:byte);
  33. (* writes byte to parallel port *)
  34. begin
  35.   port[pout] := b;
  36. end;
  37.  
  38.  
  39. function read_port:byte;
  40. (* reads byte from parallel port, inverts it if INVERT is set *)
  41. begin
  42.   if invert then read_port := not in_port
  43.             else read_port :=     in_port;
  44. end;
  45.  
  46.  
  47. procedure write_port(b:byte);
  48. (* writes byte to parallel port *)
  49. begin
  50.   port[pout] := b;
  51. end;
  52.  
  53.  
  54. var game_over : boolean; (* end program? *)
  55.     w,
  56.     i         : byte;
  57.  
  58. (* porttest *)
  59. begin
  60.   printer_no := 1;
  61.   invert     := false;
  62.   for i := 1 to paramcount do begin
  63.     if paramstr (i) = '1' then printer_no := 1;
  64.     if paramstr (i) = '2' then printer_no := 2;
  65.     if paramstr (i) = '3' then printer_no := 3;
  66.     if paramstr (i) = 'i' then invert     := true;
  67.   end;
  68.  
  69.   writeln;
  70.   writeln ('parallel port #', printer_no);
  71.   if invert then writeln ('PE and Busy inverted');
  72.  
  73.   init_ports;
  74.   game_over := false;
  75.   repeat
  76.     writeln;
  77.     writeln ('  A  - read All');
  78.     writeln ('  W  - Write port');
  79.     writeln ('  R  - Read port');
  80.     writeln ('  C  - read Continuous');
  81.     writeln ('  M  - read Masked');
  82.     writeln (' ESC - GAME OVER');
  83.     writeln ;
  84.     case upcase (readkey) of
  85.       'W': begin
  86.              write ('value to write : ');
  87.              readln (w);
  88.              out_port (w);
  89.            end;
  90.       'C': begin
  91.              repeat
  92.                write (in_port : 8);
  93.              until keypressed;
  94.              readkey;                    (* clear keyboard buffer *)
  95.              writeln;
  96.            end;
  97.       'M': begin
  98.              repeat
  99.                w := read_port;
  100.                write ('  ');
  101.                if (w and $20) <> 0 then write ('P') else write ('-');
  102.                if (w and $80)  = 0 then write ('B') else write ('-');
  103.              until keypressed;
  104.              readkey;                    (* clear keyboard buffer *)
  105.              writeln;
  106.            end;
  107.       'R': writeln('actual value:',in_port);
  108.       'A': begin
  109.              clrscr;
  110.              gotoxy (1, 2);
  111.              for i := 0 to 15 do writeln (i : 4);
  112.              repeat
  113.                for i := 0 to 15 do begin
  114.                  write_port (i);
  115.                  w := read_port;
  116.                  gotoxy (6, i + 2);
  117.                  if (w and $20) <> 0 then write ('P') else write ('-');
  118.                  if (w and $80)  = 0 then write ('B') else write ('-');
  119.                end;
  120.              until keypressed;
  121.              readkey;                    (* clear keyboard buffer *)
  122.              writeln;
  123.            end;
  124.       #27: game_over := TRUE;
  125.     end;
  126.   until game_over;
  127.   out_port (0); (* switch off interfaces powered by the parallel port *)
  128. end.
  129.  
  130.